<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <user-card
      image="https://semantic-ui.com/images/avatar2/large/kristy.png"
      name="纪伟"
      email="jiwei7065@sina.com"
    />
    <script>
      const template = `
        <style>
          :host {
            display: flex;
            align-items: center;
            width: 100%;
            max-width: 450px;
            height: 180px;
            background-color: #d4d4d4;
            border: 1px solid #d5d5d5;
            box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
            border-radius: 3px;
            overflow: hidden;
            padding: 10px;
            box-sizing: border-box;
            font-family: "Poppins", sans-serif;
          }
          .image {
            flex: 0 0 auto;
            width: 160px;
            height: 160px;
            vertical-align: middle;
            border-radius: 5px;
          }
          .container {
            box-sizing: border-box;
            padding: 20px;
            height: 160px;
          }
          .container > .name {
            font-size: 20px;
            font-weight: 600;
            line-height: 1;
            margin: 0;
            margin-bottom: 5px;
          }
          .container > .email {
            font-size: 12px;
            opacity: 0.75;
            line-height: 1;
            margin: 0;
            margin-bottom: 15px;
          }
          .container > .button {
            padding: 10px 25px;
            font-size: 12px;
            border-radius: 5px;
            text-transform: uppercase;
          }
        </style>

        <img class="image" />
        <div class="container">
          <p class="name"></p>
          <p class="email"></p>
          <button class="button">联系我</button>
        </div>
      `;
      class UserCard extends HTMLElement {
        constructor() {
          super();
          const shadow = this.attachShadow({ mode: "closed" });
          const templateElem = document.createElement("template");
          templateElem.innerHTML = template;
          const content = templateElem.content.cloneNode(true);
          content
            .querySelector("img")
            .setAttribute("src", this.getAttribute("image"));
          content.querySelector(".container>.name").innerText =
            this.getAttribute("name");
          content.querySelector(".container>.email").innerText =
            this.getAttribute("email");
          content
            .querySelector(".container > .button")
            .addEventListener("click", (e) => {
              this.dispatchEvent(
                new CustomEvent("contact-me", {
                  detail: {
                    timeStarp: Date.now(),
                  },
                })
              );
            });
          shadow.appendChild(content);
        }
      }
      window.customElements.define("user-card", UserCard);
      document
        .querySelector("user-card")
        .addEventListener("contact-me", (e) => {
          console.log("联系我", e);
        });
    </script>
  </body>
</html>
